<?php
namespace app\api\controller;


use app\common\controller\Wechat;
use think\Controller;

/**
 * 微信公众号效验类
 * Class Wxvalid
 * @package app\api\controller
 */
class Wxvalid extends Wechat{

    /**
     * 效验入口
     */
    public function firstValid(){
        if (!isset($_GET['echostr'])) {
            $this->responseMsg();
        }else{
            $res =  $this->_checkSignature();
            if($res){
                echo $_GET['echostr'];
            }
        }
    }

    /**
     * 验证签名
     * @return bool
     */
    private function _checkSignature() {
        //获得由微信公众平台请求的验证数据
        $signature = $_GET['signature'];
        $timestamp = $_GET['timestamp'];
        $nonce = $_GET['nonce'];
        //将时间戳，随机字符串，token按照字母顺序排序，并连接
        $tmp_arr = array($this->token, $timestamp, $nonce);
        sort($tmp_arr, SORT_STRING);//字典顺序
        $tmp_str = implode($tmp_arr);//连接
        $tmp_str = sha1($tmp_str);//sha1加密
        if ($signature == $tmp_str) {
            return true;
        } else {
            return false;
        }
    }



    public function responseMsg(){
        /*
        获得请求时POST:XML字符串
        不能用$_POST获取，因为没有key
         */

        //拿到数据
        $xml_str = file_get_contents("php://input");
        if(empty($xml_str)){
            die('');
        }else{
            // 解析该xml字符串，利用simpleXML
            libxml_disable_entity_loader(true);
            //禁止xml实体解析，防止xml注入
            $request_xml =  simplexml_load_string($xml_str,'SimpleXMLElement', LIBXML_NOCDATA);
            $jsonStr = json_encode($request_xml);
            $jsonArray = json_decode($jsonStr,true);
            //判断该消息的类型，通过元素MsgType

            file_put_contents('msg.txt',$jsonStr);
            switch ($jsonArray['MsgType']){
                case 'event':
                    //判断具体的事件类型（关注、取消、点击）
                    $event = $request_xml->Event;
                    if ($event=='subscribe') { // 关注事件
                        $this->_doSubscribe($jsonArray);
                    }elseif ($event=='CLICK') {//菜单点击事件
//                        $this->_doClick($jsonArray);
                    }elseif ($event=='VIEW') {//连接跳转事件
//                        $this->_doView($jsonArray);
                    }elseif($event=='user_get_card'){ //领取卡券
//                        $this->_doCard($jsonArray);
                    }elseif($event=='SCAN'){ //已关注并且扫码进入
                        $this->_doScan($jsonArray);
                    }
                    break;
                case 'text'://文本消息
                    $this->_doText($jsonArray);
                    break;
                case 'image'://图片消息
//                    $this->_doImage($jsonArray);
                    break;
                case 'voice'://语音消息
//                    $this->_doVoice($jsonArray);
                    break;
                case 'video'://视频消息
//                    $this->_doVideo($jsonArray);
                    break;
                case 'shortvideo'://短视频消息
//                    $this->_doShortvideo($jsonArray);
                    break;
                case 'location'://位置消息
//                    $this->_doLocation($jsonArray);
                    break;
                case 'link'://链接消息
//                    $this->_doLink($jsonArray);
                    break;
            }
        }

    }


    ## 扫码进入(已关注) ##
    public function _doScan($jsonArray){
       file_put_contents('data.txt',json_encode($jsonArray));

    }

    ## 订阅事件 ##
    public function _doSubscribe($jsonArray){
        file_put_contents('guanzhu.txt',json_encode($jsonArray));
        //判断事件KEY值是否是扫码对应的参数值
        if ($jsonArray['EventKey'] == '10010'){
            // 业务逻辑----
            $this->_msgText($jsonArray['FromUserName'],$jsonArray['ToUserName'],'您是扫码关注的!');
        }else{
            $this->_msgText($jsonArray['FromUserName'],$jsonArray['ToUserName'],'欢迎关注我的公众号!');
        }
    }



    ## 文本消息 ##
    public function _doText($jsonArray){
        //接受用户发来的文本信息
        $content = $jsonArray['Content'];
        if(!empty($content)){
            if($content=='id' || $content=='ID' || $content=='Id' || $content=='iD'){
                $this->_msgText($jsonArray['FromUserName'],$jsonArray['ToUserName'],  $jsonArray['FromUserName']);
            }
            $this->_msgText($jsonArray['FromUserName'],$jsonArray['ToUserName'],'技术部一哥正在努力开发哈!');
        }

    }


    /**
     * @param $to 发给谁
     * @param $from 来自谁
     * @param $content 发送内容
     */
    public function _msgText($to, $from, $content) {
        $response = sprintf($this->_msg_template['text'], $to, $from, time(), $content);
        die($response);
    }


    ## 发送的模板(必须按照微信给的xml格式) ##
    public $_msg_template = array(
        'text' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>',//文本回复XML模板
        'image' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>',//图片回复XML模板
        'music' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><MusicUrl><![CDATA[%s]]></MusicUrl><HQMusicUrl><![CDATA[%s]]></HQMusicUrl><ThumbMediaId><![CDATA[%s]]></ThumbMediaId></Music></xml>',//音乐模板
        'news' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>%s</ArticleCount><Articles>%s</Articles></xml>',// 新闻主体
        'news_item' => '<item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>',//某个新闻模板
    );


}